package __贪心算法

import (
	"math"
	"sort"
)

/*
https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/

1005. K 次取反后最大化的数组和
给你一个整数数组 nums 和一个整数 k ，按以下方法修改该数组：
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后，返回数组 可能的最大和 。

示例 1：
输入：nums = [4,2,3], k = 1
输出：5
解释：选择下标 1 ，nums 变为 [4,-2,3] 。

示例 2：
输入：nums = [3,-1,0,2], k = 3
输出：6
解释：选择下标 (1, 2, 2) ，nums 变为 [3,1,0,2] 。

示例 3：
输入：nums = [2,-3,-1,5,-4], k = 2
输出：13
解释：选择下标 (1, 4) ，nums 变为 [2,3,-1,5,4] 。
*/
func largestSumAfterKNegations(nums []int, k int) int {
	sort.Slice(nums, func(i, j int) bool { //将数组按照绝对值从大到小排序
		return math.Abs(float64(nums[i])) > math.Abs(float64(nums[j]))
	})

	for i := 0; i < len(nums); i++ { //遍历数组
		if k > 0 && nums[i] < 0 { //如果k>0 && 当前元素<0,那么进行取反操作, 消耗k的次数
			nums[i] = -nums[i]
			k--
		}
	}

	if k%2 == 1 { //此时可能k还有剩余次数, 但此时数组中已经都是正数了, 那么一直使用末尾最小的元素进行取反来消耗k的次数
		nums[len(nums)-1] = -nums[len(nums)-1]
	}

	result := 0 //声明结果, 进行数组累加求和
	for i := 0; i < len(nums); i++ {
		result += nums[i]
	}

	return result //返回结果
}
